package cn.jinjimi.app.webview;

import android.content.Context;

import com.google.gson.annotations.SerializedName;

import cn.jinjimi.base.util.GsonUtils;

/**
 *
 * @author zhenhua
 * @date 16/1/20
 */
public abstract class AbstractJavascriptBridge {
    /**
     * 调用本地方法
     * @param data
     */
    public abstract void callNativeHandler(String data);

    /**
     * 调用JS方法
     * @param method
     * @param data
     */
    public abstract void callJSHandler(String method, Object data);

    /**
     * 获取当前上下文
     * @return
     */
    public abstract Context getContext();

    /**
     * JS数据对象抽象类
     */
    public static class BaseAction {
        @SerializedName("action")
        public String action;

        @SerializedName("callbackFunction")
        public String callbackFunction;

        @SerializedName("callbackId")
        public int callbackId;

        public String toJson() {
            return GsonUtils.toJson(this);
        }

        public static String toJson(Object data){
            return GsonUtils.toJson(data);
        }

        public static <T> T fromJson(String json, Class<T> tClass) {
            return GsonUtils.fromJson(json, tClass);
        }
    }

    /**
     * JS接口的抽象类
     */
    public static abstract class AbstractJSHandler {
        /**
         * call javascript function
         * @param callback
         * @param data
         */
        public abstract void call(String callback, Object data);
    }

    /**
     * 原生接口的抽象类
     */
    public static abstract class AbstractNativeHandler {

        private String callback;

        public String getCallback() {
            return callback;
        }

        public void setCallback(String callback) {
            this.callback = callback;
        }

        /**
         * 触发Native方法
         * @param bridge
         * @param data
         * @return
         */
        public abstract BaseAction call(AbstractJavascriptBridge bridge, String data);

        /**
         * 当前Handler开放给js调用的方法名称
         * @return
         */
        public abstract String getName();
    }
}
